<?php
    //nzo2 config handling
    class config extends service implements ArrayAccess{

        private $__config;

        public function __construct($read_only = true){
            $this->read_only = $read_only;
            
            
			context::get_service("io");
        }
        
        public function set($name,$value){
			$this->__config[$name] = $value;
		}
		
        public function get($key){
			if (isset($this->__config[$key])){
				return $this->__config[$key];
			}
			return null;
		}
        
        
        /*	Замечание: так как переменная с конфигом каждый раз определена 
         * в локальном участке кода, нет возможности получить ее
         * иначе, чем через интерфейс config
         * 
         * Следует использовать это для дальнейшией проверки безопасности,
         * уровней доступа, etcetra, etcetra, etcetra
         */
        
        public function load_cfg($filename){
			#context::io()->debug("loading configuration file '{$filename}'", IO_DEBUG_NOTICE);
			include($filename);
			
			//$config is should be defined from $filename within load_cfg() scope;

			if (!isset($config)){
				context::get("io")->debug("\$config is not defined within '{$filename}'", IO_DEBUG_NOTICE);
			}else{
				foreach ($config as $key=>$value){
					$this->set($key, $value);
				}
			}
		}
		
		
		//contextual configuration loading
		public function load_cfg_enviroment(){
			$path = context::get("path")->get_root()."/config/";

			try {
				foreach(new DirectoryIterator($path) as $file){
					if (!$file->isDot() && $file->isFile()){
						$info = pathinfo($file->getFilename(), PATHINFO_EXTENSION);
						$this->load_cfg($file->getPathname());
					}
				}
			}
			catch (UnexpectedValueException $e){
				context::io()->debug("load_cfg_enviroment() - ".$e->getMessage() ,IO_DEBUG_ERROR);
			}
		}
		

        public function __get($name){

        }
        
        public function __set($name, $value){


            // todo: config::path[] = blah; config::path["libs"] = blah, etc.

            /*if (!isset($this->__config[$name])){
                $this->__config["name"] = $value;
            }else{
                throw new CoreException("Trying to modify read-only config key {$name}",EX_NONCRIT);
            }*/

        }


		//--------------------------------
		//ArrayAccess derived methods

		public function offsetGet($key) {
			return $this->get($key);
		}
		 
		public function offsetSet($key, $value) {
			$this->set[$key] = $value;
		}
		
		public function offsetExists($key) {
			return isset($this->__config[$key]);
		}
		
		public function offsetUnset($key) {
			//unset($this->__config[$key]);	fuck you
		}
    }

?>
